package offerbook;

/**
 * @date 2020/3/8 15:32
 */
public class Code10_BitOfOne_1的bit位数 {
    /**
     * 方式1：让n循环右移，统计1位数。
     * 缺陷：循环右移最高位会补，如果是负数最后都是0xff。
     * 正数可以得到正确答案。
     * <p>
     * 方式2：设定一个flag = 1，让flag循环左移与 n相与统计1个数。
     * 因为循环左移符号位会被用0填充，循环右移会填充符号位。
     */
    public static int NumberOf1(int n) {
        int bitCount = 1;
        int res = 0;
        //32bit
        for (int i = 0; i < 32; i++) {
            //n的第bitCount位不为0
            if ((n & bitCount) != 0) res++;
            bitCount = (bitCount << 1);
        }
        return res;
    }

    /**
     * 方式3：  n & (n-1) 的操作就是把n的最低位的1置为0
     */
    public static int NumberOf2(int n) {

        int res = 0;
        //32bit
        while (n != 0) {
            n &= (n - 1);
            res++;
        }
        return res;
    }

    public static void main(String[] args) {
/*        System.out.println(NumberOf2(Integer.MAX_VALUE));
        System.out.println(NumberOf2(-1));*/
        System.out.println(Integer.MAX_VALUE % 10);
        System.out.println(Integer.MIN_VALUE % 10);
    }
}
